'use strict';

module.exports = core;

const path = require('path')
const semver = require('semver')
const colors = require('colors/safe')
const userHome = require('user-home')
const pathExists = require('path-exists').sync;
const commander = require('commander')
const pkg = require('../package.json')
const log = require('@wf-imooc-cli-dev/log')
const init = require('@wf-imooc-cli-dev/init')
const exec = require('@wf-imooc-cli-dev/exec')
const constant = require('./const');

let args;

const program = new commander.Command()
async function core() {
    try {
        await prepare()
        registerCommand()
    }catch(e) {
        if(program.debug) {
            console.log(e)
        }
        log.error(e.message)
    }

}

async function prepare() {
    checkPkgVersion()
    checkUserHome()
    checkEnv()
    await checkGlobalUpdate()
}

function registerCommand() {
    program
    .name(Object.keys(pkg.bin)[0])
    .usage('<command> [options]')
    .version(pkg.version)
    .option('-d, --debug','是否开启调试模式',false)
    .option('-tp, --targetPath <projectName>','是否指定本地调试文件路径','')

    program
    .command('init [projectName]')
    .option('-f --force','是否强制初始化项目')
    .action(exec)
    // 开启debug模式
    program.on('option:debug',function(){
        process.env.LOG_LEVEL = 'verbose'
        log.level = process.env.LOG_LEVEL
    })

    //指定targetPath
    program.on('option:targetPath',function(){
        process.env.CLI_TARGET_PATH = program.targetPath
    })

    //未知命令监听
    program.on('command:*',function(obj){
        const availableCommands = program.commands.map(cmd=>cmd.name())
        console.log(colors.red('未知的命令：'+obj[0]))
        if(availableCommands.length>0){
            console.log(colors.red('可用命令： '+ availableCommands.join(',')))
        }
    })
    program.parse(process.argv)
    
    if(program.args&&program.args.length<1) {
        program.outputHelp()
        console.log()
    } 

    
}


async function checkGlobalUpdate(){
    const currentVersion = pkg.version
    const npmName = pkg.name
    const {getNpmSemverVersions} = require('@wf-imooc-cli-dev/get-npm-info')
    const lastVersions = await getNpmSemverVersions(currentVersion,npmName)
    if(lastVersions&&semver.gt(lastVersions,currentVersion)) {
        log.warn('更新提示',colors.yellow(`请手动更新 ${npmName}, 当前版本：${currentVersion},最新版本：${lastVersions},   更新命令 npm install -g ${npmName}`))
    }
}

function checkEnv() {
    const dotenv = require('dotenv')
    const dotenvPath = path.resolve(userHome,'.env')
    if(pathExists(dotenvPath)) {
        dotenv.config({
            path: dotenvPath
        })
    }
    createDefaultConfig()
}

function createDefaultConfig() {
    const cliConfig = {
        home : userHome,
    }
    if(process.env.CLI_HOME) {
        cliConfig['cliHome'] = path.join(userHome,process.env.CLI_HOME)
    } else {
        cliConfig['cliHome'] = path.join(userHome,constant.DEFAULT_CLI_HOME)
    }
    process.env.CLI_HOME_PATH = cliConfig.cliHome
}

function checkUserHome() {
    if(!userHome || !pathExists(userHome)) {
        throw new Error(colors.red('当前登录用户主目录不存在！'))
    } 
}



function checkPkgVersion() {
    log.notice('cli',pkg.version)
}